"""
@Time : 2021/9/13 10:54 
@Author : 常雷
@File : T_5布尔值为False的值.py 
@Software: PyCharm
"""
# 列举布尔值为False的常见值?
'''
0
[]
()
...
# 常见的数据类型中所有表示空的东西都可以称之为False
其他的例如:函数, 类呢
'''
print(bool(0), bool([]), bool(()), bool({}))
#     False    False     False     False
def func():
    pass

print(bool(func()))     # False
# 加括号为调用函数, 函数没有返回值默认为None, 所以是None
print(bool(func))       # True
# 不加括号为函数的索引(函数体), 函数体存在不为空所以为True


class MyClass:
    pass

print(bool(MyClass))    # True
# 类的布尔值
print(bool(MyClass()))  # True
# 类对象的布尔值
'''注:
    类中内置方法 __bool__(self):可以修改类对象的布尔值
    metaclass:
        在没有 metaclass 的情况下，子类继承父类，父类是无法对子类执行操作的，
        但有了 metaclass，就可以对子类进行操作，
        就像装饰器那样可以动态定制和修改被装饰的类，metaclass 可以动态的定制或修改继承它的子类。
        
    通过修改自定义类的元类, 重载了类的底层bool函数
'''
class MyC:
    def __bool__(self):
        return False

print(bool(MyC))    # True
print(bool(MyC()))  # False


class MyClass1(type):
    def __bool__(self):
        return False


class MyC1(metaclass=MyClass1):
    def __bool__(self):
        return False

print(bool(MyC1))    # False    给了元类 那么bool()转化的时候。根据元类去判断
print(bool(MyC1()))  # False    对象在进行转化的时候。根据这个函数去判断
"""
Python 底层语言设计层面是如何实现 metaclass 的？
    第一，所有的 Python 的用户定义类，都是 type 这个类的实例。
    第二，用户自定义类，只不过是 type 类的 __call__ 运算符重载
    第三，metaclass 是 type 的子类，通过替换 type 的 __call__ 运算符重载机制，“超越变形”正常的类

风险:
    metaclass 仅仅是给小部分 Python 开发者，在开发框架层面的 Python 库时使用的。
    而在应用层，metaclass 往往不是很好的选择。
"""